from typing import Optional, Union

import uvicorn
from fastapi import FastAPI,Cookie,Header,Response
from fastapi.openapi.docs import get_swagger_ui_html
from starlette.staticfiles import StaticFiles

# 创建 FastAPI 应用实例，并把默认的/docs请求禁用
# debug表示是否开启调试模式，默认是False
app = FastAPI(docs_url=None,debug=True)
app.mount("/static", StaticFiles(directory="../static"), name="static")    # 静态文件

@app.get("/docs", include_in_schema=False)
def custom_swagger_ui():
    return get_swagger_ui_html(
        openapi_url = "/openapi.json",
        title = "Swagger UI for FastAPI",
        swagger_js_url="/static/swagger-ui-bundle.min.js",
        swagger_css_url="/static/swagger-ui.min.css"
    )

@app.put("/settings")
# 这里我们为了表示favorite_schema是一个Cookie，我们需要使用Cookie(),否则在这里它变为了一个查询参数了
# 因为Cookie是放在头信息中的，一般不使用_来分割，使用-中划，所以此时需要使用alias别名处理
# 下面的Union与Optional类似，它指定了可以是[]指定的类型
async def settings(*,
                   response: Response,
                   favorite_schema: Optional[str] = Cookie(None,alias="favorite-schema"),
                   api_token: Union[str,None] = Header(None,alias="api-token")):
    result_dict = {
        "favorite_schema": favorite_schema,
        "api_token": api_token
    }
    # 响应浏览器并且要求浏览器在cookie中放一个favorite-schema的cookie，其值是dark,当下一次再请求时，cookie中就应该要携带这个cookie
    response.set_cookie(key="favorite-schema",value=favorite_schema)

    return result_dict

if __name__ == '__main__':
    uvicorn.run("main:app", host="127.0.0.1", port=8007, reload=True)